package sim_moteur.factory;

import java.util.HashMap;
import java.util.Map;

import sim_moteur.element.animeaux.Animal;

public class AnimauxFactory extends AbstractFactory implements
		ChoseFactoryI<Animal> {

	public final static String ANIMAL_NAME = "Animal_";
	public final static String SUFFIX_VITALITE = ".initial.vie";
	public final static float VITALITE_ANIMAL_MIN = 5.0f;
	public final static float VITALITE_ANIMAL_MAX = 15.0f;

	private int compteur = 0;

	private int numeroSimulation = 0;

	private static AnimauxFactory instance;

	private AnimauxFactory() {
	}

	/**
	 * Retourne la seule instance de fabrique d'animaux. (singleton) Noter que
	 * chaque thread possède sa propre copie du singleton
	 * 
	 * @return la fabrique
	 */
	public static AnimauxFactory getInstance() {
		if (instance == null) {
			instance = new AnimauxFactory();
		}
		return instance;
	}

	@Override
	public Animal get() {
		// Nous modifions un peu le nom avec le numéro de simulation dedans
		String nom = SIM_PREFIX_NAME + numeroSimulation + "." + ANIMAL_NAME
				+ compteur++;
		float vitalite = properties.getFloatProperty(nom + SUFFIX_VITALITE);
		if (vitalite < 0)
			vitalite = (int) ((Math.random() * VITALITE_ANIMAL_MAX - VITALITE_ANIMAL_MIN) + VITALITE_ANIMAL_MIN);

		Animal animal = new Animal(nom, vitalite);
		place(animal);

		nombre--;
		return animal;
	}

	/**
	 * Réinitialise la fabrique
	 */
	public static void reset() {
		instance = new AnimauxFactory();
	}

	/**
	 * On retrouve tous les animaux prévus dans le fichier de propriétés. Les
	 * animaux sont directement placés sur le terrain
	 */
	public Map<String, Animal> getAll() {
		Map<String, Animal> retMap = new HashMap<>();
		while (nombre > 0) {
			Animal nouvelAnimal = get();
			retMap.put(nouvelAnimal.getName(), nouvelAnimal);
		}
		return retMap;
	}

	@Override
	public void init(int pNumeroSimulation) {
		numeroSimulation = pNumeroSimulation;
		nombre = nombreAnimauxMax[pNumeroSimulation];
	}

}
